home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / bit / Bit_Union.c < prev    next >
C/C++ Source or Header  |  1988-06-19  |  3KB  |  97 lines

  1. /* 
  2.  * Bit_Union.c --
  3.  *
  4.  *    Source code for the Bit_Union library procedure.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: Bit_Union.c,v 1.1 88/06/19 14:34:52 ouster Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20. #include <sprite.h>
  21. #include "bit.h"
  22. #include "bitInt.h"
  23.  
  24.  
  25. /*-
  26.  *-----------------------------------------------------------------------
  27.  *
  28.  * Bit_Union --
  29.  *
  30.  *    Take the union of two bit masks and store it some place.
  31.  *    If no destination is given (it's a NULL pointer), the union
  32.  *    is taken but the result isn't stored anyplace.
  33.  *
  34.  * Results:
  35.  *    Returns TRUE if the union is non-empty. Stores the
  36.  *    union in the destination array, overwriting its previous
  37.  *    contents.
  38.  *
  39.  * Side Effects:
  40.  *    The destination is overwritten.
  41.  *
  42.  *-----------------------------------------------------------------------
  43.  */
  44.  
  45. Boolean
  46. Bit_Union(numBits, src1Ptr, src2Ptr, destPtr)
  47.     int              numBits;      /* Number of bits in all arrays */
  48.     register int  *src1Ptr;     /* First source for union */
  49.     register int  *src2Ptr;     /* Second source for union */
  50.     register int  *destPtr;     /* Destination of union */
  51. {
  52.     register int  i;
  53.     register Boolean rval = FALSE;
  54.     register int  lastMask;
  55.  
  56.     GET_MASK_AND_INTS (numBits, i, lastMask);
  57.  
  58.     if (destPtr == (int *)NULL) {
  59.     /*
  60.      * No destination, just go through the union and return TRUE
  61.      * as soon as we find a non-empty member
  62.      */
  63.     while (i != 0) {
  64.         if (*src1Ptr | *src2Ptr) {
  65.         return(TRUE);
  66.         }
  67.         src1Ptr++; src2Ptr++; i--;
  68.     }
  69.     if (lastMask && ((*src1Ptr | *src2Ptr) & lastMask)) {
  70.         return (TRUE);
  71.     }
  72.     } else {
  73.     /*
  74.      * Have a destination. Form the union into it and set
  75.      * rval TRUE if any of the destination integers is non-zero.
  76.      */
  77.     while (i != 0) {
  78.         *destPtr = *src1Ptr | *src2Ptr;
  79.         if (*destPtr) {
  80.         rval = TRUE;
  81.         }
  82.         destPtr++; src1Ptr++; src2Ptr++; i--;
  83.     }
  84.     if (lastMask) {
  85.         int      src1 = *src1Ptr;
  86.         int      src2 = *src2Ptr;
  87.  
  88.         *destPtr &= ~lastMask;
  89.         *destPtr |= (src1 | src2) & lastMask;
  90.         if (*destPtr & lastMask) {
  91.         rval = TRUE;
  92.         }
  93.     }
  94.     }
  95.     return(rval);
  96. }
  97.